package com.xhj.mybatis.reflection.factory;

import java.util.List;
import java.util.Properties;

/**
 * ObjectFactory
 *
 * @author XJks
 * @description MyBatis 使用 ObjectFactory 来创建所有需要的新对象。TODO:主要作用是定义创建 Java 对象的规范。
 */
public interface ObjectFactory {
    /**
     * 设置配置属性。
     * 该方法用于传递一些配置信息给 ObjectFactory 实现类。
     * 默认实现为空（NOP，No Operation），即什么都不做。
     *
     * @param properties 配置属性对象，通常由 MyBatis 配置文件传入
     */
    default void setProperties(Properties properties) {
        // NOP（无操作，默认实现什么都不做）
    }

    /**
     * 使用默认构造方法创建一个新对象。
     *
     * @param <T>  泛型类型，表示要创建的对象类型
     * @param type 要创建的对象的 Class 类型
     * @return 创建好的对象实例
     */
    <T> T create(Class<T> type);

    /**
     * 使用指定的构造方法和参数创建一个新对象。
     *
     * @param <T>                 泛型类型，表示要创建的对象类型
     * @param type                要创建的对象的 Class 类型
     * @param constructorArgTypes 构造方法参数类型的列表（Class 类型列表）
     * @param constructorArgs     构造方法参数值的列表（实际参数值）
     * @return 创建好的对象实例
     */
    <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);

    /**
     * 判断指定类型的对象是否为集合类型。
     * 主要用于支持非 java.util.Collection 类型的集合，比如 Scala 集合。
     *
     * @param <T>  泛型类型，表示要判断的对象类型
     * @param type 要判断的对象的 Class 类型
     * @return 如果是集合类型返回 true，否则返回 false
     */
    <T> boolean isCollection(Class<T> type);
}
